package com.winner.bridge_pattern;

/**
 * 桥接设计模式是一种结构型设计模式，它允许将抽象部分与实现部分分离，使它们可以独立地变化。这种模式通过创建桥接接口来实现不同的抽象与实现之间的连接。
 * 它可以在不影响客户端代码的情况下，动态地将抽象部分和实现部分组合起来。
 *
 * 想象一下你要开发一个画图软件，其中有多种形状（如圆形、矩形等）和多种颜色（如红色、蓝色等）。
 * 使用桥接模式，你可以将形状和颜色分别作为抽象部分和实现部分，然后通过桥接接口将它们连接起来
 *
 * 定义形状抽象类
 *
 * 在这个示例中，Color接口定义了不同颜色的实现，例如Red和Blue。Shape是一个抽象类，
 * 它使用Color接口作为桥接接口，将不同的形状（如Circle和Rectangle）与颜色实现部分连接起来。
 *
 * @Author wangxinle5
 * @since 2024-04-25
 */
// 定义颜色接口
interface Color {
    void applyColor();
}

// 实现不同颜色类
class Red implements Color {
    @Override
    public void applyColor() {
        System.out.println("Applying red color");
    }
}

class Blue implements Color {
    @Override
    public void applyColor() {
        System.out.println("Applying blue color");
    }
}

// 定义形状抽象类
abstract class Shape {
    protected Color color; // 使用桥接接口

    protected Shape(Color color) {
        this.color = color;
    }

    public abstract void draw();
}

// 实现不同形状类
class Circle extends Shape {
    public Circle(Color color) {
        super(color);
    }

    @Override
    public void draw() {
        System.out.print("Drawing circle with ");
        color.applyColor(); // 使用颜色接口
    }
}

class Rectangle extends Shape {
    public Rectangle(Color color) {
        super(color);
    }

    @Override
    public void draw() {
        System.out.print("Drawing rectangle with ");
        color.applyColor(); // 使用颜色接口
    }
}

// 测试桥接模式
public class BridgePatternDemo {
    public static void main(String[] args) {
        // 使用不同颜色创建形状  Shape抽象类有桥接接口 Circle和Rectangle就可以用桥接接口的方法
        Shape redCircle = new Circle(new Red());
        Shape blueRectangle = new Rectangle(new Blue());

        // 绘制形状
        redCircle.draw();
        blueRectangle.draw();
    }
}
